Apple 在 CoreImage 裡提供了強大的 CIFilter 方便我們影像處理
前提是只能處理 CIImage,所以需要先將 Image 轉成 CIImage
convenience init?(named: String) {
guard let image = UIImage(named: named)?.cgImage else {
return nil
}
self.init(cgImage: image)
}
回到 CIFilter,
原本使用的方法: CIFilter(name: "CIBoxBlur"),太不Swifty了。
還好官方提供了另一種方法:只要 import CoreImage.CIFilterBuiltins 就能使用 CIFilter.boxBlur()
進入主題
人物去背,只要使用 CIFilter.personSegmentation() 就可以達到效果
以Jay為例
let input = CIImage(named: "Jay")!
let person = CIFilter.personSegmentation()
person.inputImage = input
person.qualityLevel = 1
就會得到遮照圖
這時候只要讓原圖混上紅色遮照圖就完成了
let mask = CIFilter.blendWithRedMask()
mask.inputImage = input
mask.maskImage = person.outputImage
等等,發生什麼事?
仔細看就會發現,person 和 input 的長寬比不一樣
所以需要做調整
extension CIImage {
func scale(size: CGSize) -> CIImage {
let x = size.width / self.extent.width
let y = size.height / self.extent.height
let transform = CGAffineTransform(scaleX: x, y: y)
return transformed(by: transform)
}
}
mask.maskImage = person.outputImage!.scale(size: size)